<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>

<link href='https://fonts.loli.net/css?family=Merriweather:900,900italic,300,300italic&subset=latin-ext' rel='stylesheet' type='text/css' /><link href='https://fonts.loli.net/css?family=Lato:900,300&subset=latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color: #ffffff; --text-color: #333333; --select-text-bg-color: #B5D6FC; --select-text-font-color: auto; --monospace: "Lucida Console",Consolas,"Courier",monospace; --title-bar-height: 20px; }
.mac-os-11 { --title-bar-height: 28px; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857143; overflow-x: hidden; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; tab-size: 4; background-position: inherit inherit; background-repeat: inherit inherit; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; word-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
.typora-export .task-list-item input { pointer-events: none; }
@media screen and (max-width: 500px) { 
  body.typora-export { padding-left: 0px; padding-right: 0px; }
  #write { padding-left: 20px; padding-right: 20px; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
button, input, select, textarea { color: inherit; font-family: inherit; font-size: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px; }
thead, tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right-width: 0px; background-color: inherit; }
.CodeMirror-linenumber { }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; position: relative !important; background-position: inherit inherit; background-repeat: inherit inherit; }
.md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
svg { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; background-position: 0px 0px; background-repeat: initial initial; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li blockquote { margin: 1rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print { 
  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; padding-bottom: 0px !important; }
  .typora-export * { -webkit-print-color-adjust: exact; }
  .typora-export #write { break-after: avoid; }
  .typora-export #write::after { height: 0px; }
  .is-mac table { break-inside: avoid; }
  .typora-export-show-outline .typora-export-sidebar { display: none; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background-color: rgb(204, 204, 204); display: block; overflow-x: hidden; background-position: initial initial; background-repeat: initial initial; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
.MathJax_ref { fill: currentcolor; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) { 
  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
  .md-toc-h4 .md-toc-inner { margin-left: 5em; }
  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
  .md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background-color: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; background-position: initial initial; background-repeat: initial initial; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.6; font-family: var(--monospace); }
code { text-align: left; }
a.md-print-anchor { white-space: pre !important; border: none !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; text-shadow: initial !important; background-position: 0px 0px !important; background-repeat: initial initial !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom-width: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
mark { background-color: rgb(255, 255, 0); color: rgb(0, 0, 0); background-position: initial initial; background-repeat: initial initial; }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
.md-expand mark .md-meta { opacity: 0.3 !important; }
mark .md-meta { color: rgb(0, 0, 0); }
@media print { 
  .typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }
}
.md-diagram-panel .messageText { stroke: none !important; }
.md-diagram-panel .start-state { fill: var(--node-fill); }
.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }
.md-fences.md-fences-math { font-size: 1em; }
.md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; }
.md-fences-advanced:not(.md-focus) { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit inherit; background-repeat: inherit inherit; }
.typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; }
.typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; }
.typora-export-show-outline #write { --webkit-flex: 2; flex: 2 1 0%; }
.typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; }
@media screen and (max-width: 1024px) { 
  .typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; }
}
@media screen and (max-width: 800px) { 
  .typora-export-sidebar { display: none; }
}
.outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; }
.outline-content ul { margin-top: 0px; margin-bottom: 0px; }
.outline-content strong { font-weight: 400; }
.outline-expander { width: 1rem; height: 1.428571429rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; }
.outline-expander::before { content: ''; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; }
.outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; }
.outline-expander:hover::before { content: ''; }
.outline-h1 > .outline-item { padding-left: 0px; }
.outline-h2 > .outline-item { padding-left: 1em; }
.outline-h3 > .outline-item { padding-left: 2em; }
.outline-h4 > .outline-item { padding-left: 3em; }
.outline-h5 > .outline-item { padding-left: 4em; }
.outline-h6 > .outline-item { padding-left: 5em; }
.outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; }
.outline-label:hover { text-decoration: underline; }
.outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); }
.outline-item:hover { margin-left: -28px; margin-right: -28px; border-left-width: 28px; border-left-style: solid; border-left-color: transparent; border-right-width: 28px; border-right-style: solid; border-right-color: transparent; }
.outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; }
.outline-item-open > .outline-item > .outline-expander::before { content: ''; }
.outline-children { display: none; }
.info-panel-tab-wrapper { display: none; }
.outline-item-open > .outline-children { display: block; }
.typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; }
.typora-export .outline-item:hover { margin-right: -8px; border-right-width: 8px; border-right-style: solid; border-right-color: transparent; }
.typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; }
.typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: '−'; }
.typora-export-collapse-outline .outline-children { display: none; }
.typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; }
.typora-export-no-collapse-outline .outline-expander::before { content: "" !important; }
.typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; }
.md-inline-math-container mjx-container { zoom: 0.95; }


@include-when-export url(https://fonts.loli.net/css?family=Merriweather:900,900italic,300,300italic&subset=latin-ext);
@include-when-export url(https://fonts.loli.net/css?family=Lato:900,300&subset=latin-ext);

:root {
	--control-text-color: #777;
}

/**
 * forked from pixyll.com
 * MIT license
 */

h1,
.h1,
.f1 {
	font-size: 2rem;
	line-height: 2.5rem;
}
h2,
.h2,
.f2 {
	font-size: 1.5rem;
	line-height: 2rem;
}
h3,
.h3,
.f3 {
	font-size: 1.25rem;
	line-height: 1.5rem;
}
p,
.p,
.f4,
h4,
h5,
h6,
dl,
ol,
ul,
pre[cid],
div[cid],
#typora-source {
	font-size: 1.125rem;
	line-height: 1.5rem;
}

h4 {
	font-size: 1.13rem;
}
/*
 Pixyll
 A simple, beautiful theme for Jekyll that emphasizes content rather than aesthetic fluff.
 Best served with BASSCSS (http://jxnblk.github.io/basscss)
 Crafted with <3 by John Otander (@4lpine) - ©2015 John Otander MIT License http://opensource.org/licenses/MIT

*/

body {
	font-family: "Merriweather", "PT Serif", Georgia, "Times New Roman", "STSong", 'Segoe UI Emoji', Serif;
	line-height: 1.5rem;
	font-weight: 400;
}

#write {
	max-width: 914px;
	color: #333;
}

@media only screen and (min-width: 1400px) {
	#write {
		max-width: 1100px;
	}
}

@media only screen and (min-width: 1700px) {
	#write {
		max-width: 1200px;
	}
}

img {
	width: auto;
	max-width: 100%;
}
body {
	font-size: 1.5rem;
	box-sizing: border-box;
	-moz-box-sizing: border-box;
	-webkit-box-sizing: border-box;
}

.ty-table-edit {
	background: #ededed;
}

table {
	width: 100%;
	font-size: 1.125rem;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td,
table > tfoot > tr > th,
table > tfoot > tr > td {
	padding: 12px;
	line-height: 1.2;
	vertical-align: top;
	border-top: 1px solid #333;
}
table > thead > tr > th {
	vertical-align: bottom;
	border-bottom: 2px solid #333;
}
table > caption + thead > tr:first-child > th,
table > caption + thead > tr:first-child > td,
table > colgroup + thead > tr:first-child > th,
table > colgroup + thead > tr:first-child > td,
table > thead:first-child > tr:first-child > th,
table > thead:first-child > tr:first-child > td {
	border-top: 0;
}
table > tbody + tbody {
	border-top: 2px solid #333;
}
p {
	font-weight: 300;
	line-height: 1.5;
}
abbr {
	border-bottom: 1px black dotted;
	cursor: help;
}
pre,
code {
	font-family: Menlo, Monaco, "Courier New", monospace;
}

code,
.md-fences  {
	color: #7a7a7a;
}

.md-fences {
	padding: 1.125em;
	margin-bottom: 0.88em;
	font-size: 1rem;
	border: 1px solid #7a7a7a;
	padding-bottom: 0.5rem;
	padding-top: 0.5rem;
}

blockquote {
	padding: 1.33em;
	font-style: italic;
	border-left: 5px solid #7a7a7a;
	color: #555;
}
blockquote em {
	color: #000;
}
blockquote footer {
	font-size: .85rem;
	font-style: normal;
	background-color: #fff;
	color: #7a7a7a;
	border-color: transparent;
}
h1,
.h1,
h2,
.h2,
h3,
.h3,
h4,
.h4,
h5,
.h5,
h6,
.h6 {
	font-family: "Lato", 'Helvetica Neue', Helvetica, sans-serif;
	font-weight: bold;
	line-height: 1.2;
	margin: 1em 0 0.5em;
}
@media screen and (min-width: 48em) {
	.h1,
	h1 {
		font-size: 3.250rem;
	}
	.h2,
	h2 {
		font-size: 2.298rem;
	}
	.h3,
	h3 {
		font-size: 1.625rem;
	}
	.h4,
	h4 {
		font-size: 1.3rem;
	}
	#write>h4.md-focus:before,
	#write>h5.md-focus:before,
	#write>h6.md-focus:before{
		top: 1px;
	}
	.p,
	p,
	li {
		font-size: 1.25rem;
		line-height: 1.8;
	}
	table {
		font-size: 1.25rem;
	}
}
@media (max-width: 48em) {
	blockquote {
		margin-left: 1rem;
		margin-right: 0;
		padding: 0.5em;
	}
	.h1,
	h1 {
		font-size: 2.827rem;
	}
	.h2,
	h2 {
		font-size: 1.999rem;
	}
	.h3,
	h3 {
		font-size: 1.413rem;
	}
	.h4,
	h4 {
		font-size: 1.3rem;
	}
}
@media screen and (min-width: 64em) {
	.h1,
	h1 {
		font-size: 4.498rem;
	}
	.h2,
	h2 {
		font-size: 2.29rem;
	}
	.h3,
	h3 {
		font-size: 1.9rem;
	}
	.h4,
	h4 {
		font-size: 1.591rem;
	}
	#write>h4.md-focus:before{
		top:4px;
	}
}
a {
	color: #463F5C;
	text-decoration: underline;
}

#write {
	padding-top: 2rem;
}

#write pre.md-meta-block {
	min-height: 35px;
	padding: 0.5em 1em;
	white-space: pre;
	border: 0px;

	border-left: 30px #f8f8f8 solid;
	border-right: 30px #f8f8f8 solid;
	width: 100vw;
	max-width: calc(100% + 60px);

	margin-left: -30px;
	margin-bottom: 2em;
	margin-top: -2010px;
	padding-top: 2000px;
	padding-bottom: 10px;
	line-height: 1.5em;
	color: #7a7a7a;
	background-color: #fafafa;
	font-family: 'Lato', 'Helvetica Neue', Helvetica, sans-serif;
	font-weight: 300;
	clear: both;
	padding-left: 0;
	font-size:1.125rem;
}
.md-image>.md-meta {
	color: #463F5C
}
.footnotes {
	font-size:1.1rem;
}
.md-tag {
	font-family: 'Lato', 'Helvetica Neue', Helvetica, sans-serif;
}
.code-tooltip {
	background: white;
}
.code-tooltip-content {
	font-size: 1.1rem;
}

.task-list{
	padding-left: 0;
}

.md-task-list-item {
	padding-left:34px;
}

.md-task-list-item > input{
	width: 1.25rem;
	height: 1.25rem;
	display: block;
	-webkit-appearance: initial;
	top: -0.2rem;
	margin-left: -1.6em;
	margin-top: calc(1rem - 7px);
	border: none;
}

.md-task-list-item > input:focus{
	outline: none;
	box-shadow: none;
}

.md-task-list-item > input:before{
	border: 1px solid #555;
	border-radius: 1.5rem;
	width: 1.5rem;
	height: 1.5rem;
	background: #fff;
	content: ' ';
	transition: background-color 200ms ease-in-out;
	display: block;
}

.md-task-list-item > input:checked:before,
.md-task-list-item > input[checked]:before{
	background: #333;
	border-width: 2px;
	display:inline-block;
	transition: background-color 200ms ease-in-out;
}

.md-task-list-item > input:checked:after,
.md-task-list-item > input[checked]:after {
	opacity: 1;
}

.md-task-list-item > input:after {
	opacity: 1;
	-webkit-transition: opacity 0.05s ease-in-out;
	-moz-transition: opacity 0.05s ease-in-out;
	transition: opacity 0.05s ease-in-out;
	-webkit-transform: rotate(-45deg);
	-moz-transform: rotate(-45deg);
	transform: rotate(-45deg);
	position: absolute;
	top: 0.4375rem;
	left: 0.28125rem;
	width: 0.9375rem;
	height: 0.5rem;
	border: 3px solid #fff;
	border-top: 0;
	border-right: 0;
	content: ' ';
	opacity: 0;
}

.md-tag {
	color:inherit;
}

.md-toc:focus .md-toc-content{
	margin-top: 19px;
}

#typora-sidebar {
	font-size:1rem !important;
}

.html-for-mac #typora-sidebar {
	background-color:white;
}

.outline-content li, .outline-content ul {
	font-size:1rem !important;
}

.outline-title {
	line-height: inherit;
	margin-top: 10px;
}

.outline-expander {
	width: 18px;
}

.outline-expander:before {
 	content: "+";
	font-family: inherit;
	color: rgb(108, 108, 108); 
  font-size: 1.5rem;
 	top: -0.1rem;
}

.outline-expander:hover:before {
	content: "+";
}

.outline-item-open>.outline-item>.outline-expander:before{
	content: "-";
}

/** source code mode */
#typora-source {
	font-family: Courier, monospace;
    color: #6A6A6A;
}

.os-windows #typora-source {
	font-family: inherit;
}

.cm-s-typora-default .cm-header, 
.cm-s-typora-default .cm-property,
.CodeMirror.cm-s-typora-default div.CodeMirror-cursor {
	color: #428bca;
}

.cm-s-typora-default .cm-atom, .cm-s-typora-default .cm-number {
	color: #777777;
}

.md-diagram-panel {
	margin-top: 24px;
	margin-left: -1.2em;
}

.md-mathjax-midline {
	background: #fafafa;
}

.enable-diagrams pre.md-fences[lang="sequence"] .code-tooltip,
.enable-diagrams pre.md-fences[lang="flow"] .code-tooltip,
.enable-diagrams pre.md-fences[lang="mermaid"] .code-tooltip {
    bottom: -3.4em;
}

.dropdown-menu .divider {
	border-color: #e5e5e5;
}

 @media print { @page {margin: 0 0 0 0;} body.typora-export {padding-left: 0; padding-right: 0;} #write {padding:0;}}
</style><title>正则表达式速查备忘手册</title>
</head>
<body class='typora-export'><div class='typora-export-content'>
<div id='write'  class=''><h1 id='正则表达式速查备忘手册'><span>《正则表达式速查备忘手册》</span></h1><ul><li><span>由于时间仓促和个⼈精⼒有限，难免会有疏漏和不当的地⽅，还望多多谅解</span></li><li><span>该⽂档会持续更新，有新东⻄再往⾥加</span></li><li><span>后续整理出来的资源和文档会第一时间在此分享 ↓</span></li></ul><p><img src="https://codesheep.oss-cn-hangzhou.aliyuncs.com/blog/contact1.jpg" referrerpolicy="no-referrer"></p><p><span>本手册在线阅读地址为：</span><a href='https://www.r2coding.com/'><span>https://www.r2coding.com/</span></a></p><h2 id='附其他干货文档笔记下载'><span>附：其他干货文档笔记下载</span></h2><blockquote><p><span>（点击标题链接可跳转）</span></p></blockquote><ul><li><a href='https://mp.weixin.qq.com/s/GJYVt376C_g4406ux5uw0Q'><span>Linux速查备忘手册.pdf下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/EaDLaLy3YjrNiSoNofwMMA'><span>数据结构和算法刷题笔记.pdf下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/qR6KTfldk41lsOj1Ghp6Og'><span>LeetCode算法刷题C/C++版答案pdf下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/kWTJ9640mPegr5wqVE0GMg'><span>LeetCode算法刷题Java版答案pdf下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/EKBRCNr_3n0y8CCSUNPdPg'><span>找工作简历模板集(word格式)下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/jn7oraFlhRkOmiv3rh74WA'><span>Java基础核心知识大总结.pdf 下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/BRQ-3uvstdZPO-cnLGCVzA'><span>C/C++常见面试题（含答案）下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/miV4SH1Eb_FMogQ2XYvPuA'><span>设计模式学习笔记.pdf下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/x9E7ogAxFNpODXkAXCZZ3w'><span>Java后端开发学习路线+知识点总结</span></a></li><li><a href='https://mp.weixin.qq.com/s/xUKlD-Ro4x55NfANAwxJUw'><span>前端开发学习路线+知识点总结</span></a></li><li><a href='https://mp.weixin.qq.com/s/vBCwU-BCsGVNpjJM__LheQ'><span>大数据开发学习路线+知识点总结</span></a></li><li><a href='https://mp.weixin.qq.com/s/ac8vgjob8nDqM1Q7FGLRiA'><span>C/C++(后台)学习路线+知识点总结</span></a></li><li><a href='https://mp.weixin.qq.com/s/nkBsUgbuMK3ArHfFc2417w'><span>嵌入式开发学习路线+知识点总结</span></a></li></ul><hr /><h1 id='基础正则表达式速查表'><strong><span>基础正则表达式速查表</span></strong></h1><h2 id='字符'><strong><span>字符</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>表达式</span></th><th style='text-align:left;' ><span>描述</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><code>[abc]</code></td><td style='text-align:left;' ><span>字符集。匹配集合中所含的任一字符。</span></td></tr><tr><td style='text-align:left;' ><code>[^abc]</code></td><td style='text-align:left;' ><span>否定字符集。匹配任何不在集合中的字符。</span></td></tr><tr><td style='text-align:left;' ><code>[a-z]</code></td><td style='text-align:left;' ><span>字符范围。匹配指定范围内的任意字符。</span></td></tr><tr><td style='text-align:left;' ><code>.</code></td><td style='text-align:left;' ><span>匹配除换行符以外的任何单个字符。</span></td></tr><tr><td style='text-align:left;' ><code>\</code></td><td style='text-align:left;' ><span>转义字符。</span></td></tr><tr><td style='text-align:left;' ><code>\w</code></td><td style='text-align:left;' ><span>匹配任何字母数字，包括下划线（等价于</span><code>[A-Za-z0-9_]</code><span>）。</span></td></tr><tr><td style='text-align:left;' ><code>\W</code></td><td style='text-align:left;' ><span>匹配任何非字母数字（等价于</span><code>[^A-Za-z0-9_]</code><span>）。</span></td></tr><tr><td style='text-align:left;' ><code>\d</code></td><td style='text-align:left;' ><span>数字。匹配任何数字。</span></td></tr><tr><td style='text-align:left;' ><code>\D</code></td><td style='text-align:left;' ><span>非数字。匹配任何非数字字符。</span></td></tr><tr><td style='text-align:left;' ><code>\s</code></td><td style='text-align:left;' ><span>空白。匹配任何空白字符，包括空格、制表符等。</span></td></tr><tr><td style='text-align:left;' ><code>\S</code></td><td style='text-align:left;' ><span>非空白。匹配任何非空白字符。</span></td></tr></tbody></table></figure><h2 id='分组和引用'><strong><span>分组和引用</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>表达式</span></th><th style='text-align:left;' ><span>描述</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><code>(expression)</code></td><td style='text-align:left;' ><span>分组。匹配括号里的整个表达式。</span></td></tr><tr><td style='text-align:left;' ><code>(?:expression)</code></td><td style='text-align:left;' ><span>非捕获分组。匹配括号里的整个字符串但不获取匹配结果，拿不到分组引用。</span></td></tr><tr><td style='text-align:left;' ><code>\num</code></td><td style='text-align:left;' ><span>对前面所匹配分组的引用。比如</span><code>(\d)\1</code><span>可以匹配两个相同的数字，</span><code>(Code)(Sheep)\1\2</code><span>则可以匹配</span><code>CodeSheepCodeSheep</code><span>。</span></td></tr></tbody></table></figure><h2 id='锚点边界'><strong><span>锚点/边界</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>表达式</span></th><th style='text-align:left;' ><span>描述</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><code>^</code></td><td style='text-align:left;' ><span>匹配字符串或行开头。</span></td></tr><tr><td style='text-align:left;' ><code>$</code></td><td style='text-align:left;' ><span>匹配字符串或行结尾。</span></td></tr><tr><td style='text-align:left;' ><code>\b</code></td><td style='text-align:left;' ><span>匹配单词边界。比如</span><code>Sheep\b</code><span>可以匹配</span><code>CodeSheep</code><span>末尾的</span><code>Sheep</code><span>，不能匹配</span><code>CodeSheepCode</code><span>中的</span><code>Sheep</code><span>。</span></td></tr><tr><td style='text-align:left;' ><code>\B</code></td><td style='text-align:left;' ><span>匹配非单词边界。比如</span><code>Code\B</code><span>可以匹配</span><code>HelloCodeSheep</code><span>中的</span><code>Code</code><span>，不能匹配</span><code>HelloCode</code><span>中的</span><code>Code</code><span>。</span></td></tr></tbody></table></figure><h2 id='数量表示'><strong><span>数量表示</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>表达式</span></th><th style='text-align:left;' ><span>描述</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><code>?</code></td><td style='text-align:left;' ><span>匹配前面的表达式0个或1个。即表示可选项。</span></td></tr><tr><td style='text-align:left;' ><code>+</code></td><td style='text-align:left;' ><span>匹配前面的表达式至少1个。</span></td></tr><tr><td style='text-align:left;' ><code>*</code></td><td style='text-align:left;' ><span>匹配前面的表达式0个或多个。</span></td></tr><tr><td style='text-align:left;' ><code>|</code></td><td style='text-align:left;' ><span>或运算符。并集，可以匹配符号前后的表达式。</span></td></tr><tr><td style='text-align:left;' ><code>{m}</code></td><td style='text-align:left;' ><span>匹配前面的表达式m个。</span></td></tr><tr><td style='text-align:left;' ><code>{m,}</code></td><td style='text-align:left;' ><span>匹配前面的表达式最少m个。</span></td></tr><tr><td style='text-align:left;' ><code>{m,n}</code></td><td style='text-align:left;' ><span>匹配前面的表达式最少m个，最多n个。</span></td></tr></tbody></table></figure><h2 id='预查断言'><strong><span>预查断言：</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>表达式</span></th><th style='text-align:left;' ><span>描述</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><code>(?=)</code></td><td style='text-align:left;' ><span>正向预查。比如</span><code>Code(?=Sheep)</code><span>能匹配</span><code>CodeSheep</code><span>中的</span><code>Code</code><span>，但不能匹配</span><code>CodePig</code><span>中的</span><code>Code</code><span>。</span></td></tr><tr><td style='text-align:left;' ><code>(?!)</code></td><td style='text-align:left;' ><span>正向否定预查。比如</span><code>Code(?!Sheep)</code><span>不能匹配</span><code>CodeSheep</code><span>中的</span><code>Code</code><span>，但能匹配</span><code>CodePig</code><span>中的</span><code>Code</code><span>。</span></td></tr><tr><td style='text-align:left;' ><code>(?&lt;=)</code></td><td style='text-align:left;' ><span>反向预查。比如</span><code>(?&lt;=Code)Sheep</code><span>能匹配</span><code>CodeSheep</code><span>中的</span><code>Sheep</code><span>，但不能匹配</span><code>ReadSheep</code><span>中的</span><code>Sheep</code><span>。</span></td></tr><tr><td style='text-align:left;' ><code>(?&lt;!)</code></td><td style='text-align:left;' ><span>反向否定预查。比如</span><code>(?&lt;!Code)Sheep</code><span>不能匹配</span><code>CodeSheep</code><span>中的</span><code>Sheep</code><span>，但能匹配</span><code>ReadSheep</code><span>中的</span><code>Sheep</code><span>。</span></td></tr></tbody></table></figure><h2 id='特殊标志'><strong><span>特殊标志</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>表达式</span></th><th style='text-align:left;' ><span>描述</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><code>/.../i</code></td><td style='text-align:left;' ><span>忽略大小写。</span></td></tr><tr><td style='text-align:left;' ><code>/.../g</code></td><td style='text-align:left;' ><span>全局匹配。</span></td></tr><tr><td style='text-align:left;' ><code>/.../m</code></td><td style='text-align:left;' ><span>多行修饰符。用于多行匹配。</span></td></tr></tbody></table></figure><h1 id='常用正则表达式示例'><strong><span>常用正则表达式示例</span></strong></h1><h2 id='数字校验'><strong><span>数字校验</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>描述</span></th><th style='text-align:left;' ><span>正则表达式</span></th><th style='text-align:left;' ><span>备注</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>数字</span></td><td style='text-align:left;' ><code>^[0-9]*$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>n位数字</span></td><td style='text-align:left;' ><code>^\d{n}$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>至少n位数字</span></td><td style='text-align:left;' ><code>^\d{n,}$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>m~n位数字</span></td><td style='text-align:left;' ><code>^\d{m,n}$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>整数</span></td><td style='text-align:left;' ><code>^(-?[1-9]\d*)$</code></td><td style='text-align:left;' ><span>非0开头，包括正整数和负整数</span></td></tr><tr><td style='text-align:left;' ><span>正整数</span></td><td style='text-align:left;' ><code>^[1-9]\d*$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>负整数</span></td><td style='text-align:left;' ><code>^-[1-9]\d*$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>非负整数</span></td><td style='text-align:left;' ><code>^(([1-9]\d*)|0)$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>非正整数</span></td><td style='text-align:left;' ><code>^((-[1-9]\d*)|0)$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>浮点数</span></td><td style='text-align:left;' ><code>^-?(?:[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0\.0+|0)$</code></td><td style='text-align:left;' ><span>包括正浮点数和负浮点数</span></td></tr><tr><td style='text-align:left;' ><span>正浮点数</span></td><td style='text-align:left;' ><code>^(?:[1-9]\d*\.\d*|0\.\d*[1-9]\d*)$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>负浮点数</span></td><td style='text-align:left;' ><code>^-(?:[1-9]\d*\.\d*|0\.\d*[1-9]\d*)$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>非正浮点数</span></td><td style='text-align:left;' ><code>^(?:-(?:[1-9]\d*\.\d+|0\.\d*[1-9]\d*)|0\.0+|0)$</code></td><td style='text-align:left;' ><span>包含0</span></td></tr><tr><td style='text-align:left;' ><span>非负浮点数</span></td><td style='text-align:left;' ><code>^(?:[1-9]\d*\.\d+|0\.\d+|0\.0+|0)$</code></td><td style='text-align:left;' ><span>包含0</span></td></tr><tr><td style='text-align:left;' ><span>仅一位小数</span></td><td style='text-align:left;' ><code>^-?(?:0|[1-9][0-9]*)\.[0-9]{1}$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>最少一位小数</span></td><td style='text-align:left;' ><code>^-?(?:0|[1-9][0-9]*)\.[0-9]{1,}$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>最多两位小数</span></td><td style='text-align:left;' ><code>^-?(?:0|[1-9][0-9]*)\.[0-9]{1,2}$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>连续重复的数字</span></td><td style='text-align:left;' ><code>^(\d)\1+$</code></td><td style='text-align:left;' ><span>例如：</span><code>111</code><span>，</span><code>222</code></td></tr></tbody></table></figure><h2 id='字符校验'><strong><span>字符校验</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>描述</span></th><th style='text-align:left;' ><span>正则表达式</span></th><th style='text-align:left;' ><span>备注</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>中文</span></td><td style='text-align:left;' ><code>^[\u4E00-\u9FA5]+$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>全角字符</span></td><td style='text-align:left;' ><code>^[\uFF00-\uFFFF]+$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>半角字符</span></td><td style='text-align:left;' ><code>^[\u0000-\u00FF]+$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>英文字符串（大写）</span></td><td style='text-align:left;' ><code>^[A-Z]+$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>英文字符串（小写）</span></td><td style='text-align:left;' ><code>^[a-z]+$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>英文字符串（不区分大小写）</span></td><td style='text-align:left;' ><code>^[A-Za-z]+$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>中文和数字</span></td><td style='text-align:left;' ><code>^(?:[\u4E00-\u9FA5]{0,}|\d)+$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>英文和数字</span></td><td style='text-align:left;' ><code>^[A-Za-z0-9]+$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>数字、英文字母或者下划线组成的字符串</span></td><td style='text-align:left;' ><code>^\w+$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>中文、英文、数字包括下划线</span></td><td style='text-align:left;' ><code>^[\u4E00-\u9FA5\w]+$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>不含字母的字符串</span></td><td style='text-align:left;' ><code>^[^A-Za-z]*$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>连续重复的字符串</span></td><td style='text-align:left;' ><code>^(.)\1+$</code></td><td style='text-align:left;' ><span>例如：</span><code>aaa</code><span>，</span><code>bbb</code></td></tr><tr><td style='text-align:left;' ><span>长度为n的字符串</span></td><td style='text-align:left;' ><code>^.{n}$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>ASCII</span></td><td style='text-align:left;' ><code>^[ -~]$</code></td><td style='text-align:left;' >&nbsp;</td></tr></tbody></table></figure><h2 id='日期和时间校验'><strong><span>日期和时间校验</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>描述</span></th><th style='text-align:left;' ><span>正则表达式</span></th><th style='text-align:left;' ><span>备注</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>日期</span></td><td style='text-align:left;' ><code>^\d{1,4}-(?:1[0-2]|0?[1-9])-(?:0?[1-9]|[1-2]\d|30|31)$</code></td><td style='text-align:left;' ><span>弱校验，例如：</span><code>2022-06-12</code></td></tr><tr><td style='text-align:left;' ><span>日期</span></td><td style='text-align:left;' ><code>^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$</code></td><td style='text-align:left;' ><span>严格校验，考虑平闰年</span></td></tr><tr><td style='text-align:left;' ><span>时间</span></td><td style='text-align:left;' ><code>^(?:1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$</code></td><td style='text-align:left;' ><span>12小时制，例如：</span><code>11:21:31</code></td></tr><tr><td style='text-align:left;' ><span>时间</span></td><td style='text-align:left;' ><code>^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$</code></td><td style='text-align:left;' ><span>24小时制，例如：</span><code>23:21:31</code></td></tr><tr><td style='text-align:left;' ><span>日期+时间</span></td><td style='text-align:left;' ><code>^(\d{1,4}-(?:1[0-2]|0?[1-9])-(?:0?[1-9]|[1-2]\d|30|31)) ((?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d)$</code></td><td style='text-align:left;' ><span>例如：</span><code>2000-11-11 23:20:21</code></td></tr></tbody></table></figure><h2 id='日常生活相关'><strong><span>日常生活相关</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>描述</span></th><th style='text-align:left;' ><span>正则表达式</span></th><th style='text-align:left;' ><span>备注</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>中文名</span></td><td style='text-align:left;' ><code>^[\u4E00-\u9FA5·]{2,16}$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>英文名</span></td><td style='text-align:left;' ><code>^[a-zA-Z][a-zA-Z\s]{0,20}[a-zA-Z]$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>车牌号</span></td><td style='text-align:left;' ><code>^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$</code></td><td style='text-align:left;' ><span>不含新能源</span></td></tr><tr><td style='text-align:left;' ><span>车牌号</span></td><td style='text-align:left;' ><code>^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z](?:(?:[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳])|(?:(?:\d{5}[A-HJK])|(?:[A-HJK][A-HJ-NP-Z0-9][0-9]{4})))$</code></td><td style='text-align:left;' ><span>包含新能源</span></td></tr><tr><td style='text-align:left;' ><span>火车车次</span></td><td style='text-align:left;' ><code>^[GCDZTSPKXLY1-9]\d{1,4}$</code></td><td style='text-align:left;' ><span>例如：</span><code>G1234</code></td></tr><tr><td style='text-align:left;' ><span>手机号</span></td><td style='text-align:left;' ><code>^(?:(?:\+|00)86)?1[3-9]\d{9}$</code></td><td style='text-align:left;' ><span>弱匹配</span></td></tr><tr><td style='text-align:left;' ><span>手机号</span></td><td style='text-align:left;' ><code>^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$</code></td><td style='text-align:left;' ><span>严格匹配</span></td></tr><tr><td style='text-align:left;' ><span>固话号码</span></td><td style='text-align:left;' ><code>^(?:(?:\d{3}-)?\d{8}|^(?:\d{4}-)?\d{7,8})(?:-\d+)?$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>手机IMEI码</span></td><td style='text-align:left;' ><code>^\d{15,17}$</code></td><td style='text-align:left;' ><span>一般是15位</span></td></tr><tr><td style='text-align:left;' ><span>邮编</span></td><td style='text-align:left;' ><code>^(?:0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$</code></td><td style='text-align:left;' ><span>例如：</span><code>211100</code></td></tr><tr><td style='text-align:left;' ><span>统一社会信用代码</span></td><td style='text-align:left;' ><code>^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>身份证号码(1代)</span></td><td style='text-align:left;' ><code>^[1-9]\d{7}(?:0\d|10|11|12)(?:0[1-9]|[1-2][\d]|30|31)\d{3}$</code></td><td style='text-align:left;' ><span>15位数字</span></td></tr><tr><td style='text-align:left;' ><span>身份证号码(2代)</span></td><td style='text-align:left;' ><code>^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[0-9Xx]$</code></td><td style='text-align:left;' ><span>18位数字</span></td></tr><tr><td style='text-align:left;' ><span>QQ号</span></td><td style='text-align:left;' ><code>^[1-9][0-9]{4,}$</code></td><td style='text-align:left;' ><span>一般是5到10位</span></td></tr><tr><td style='text-align:left;' ><span>微信号</span></td><td style='text-align:left;' ><code>^[a-zA-Z][-_a-zA-Z0-9]{5,19}$</code></td><td style='text-align:left;' ><span>一般6~20位，字母开头，可包含字母、数字、-、_，不含特殊字符</span></td></tr><tr><td style='text-align:left;' ><span>股票代码</span></td><td style='text-align:left;' ><code>^(s[hz]|S[HZ])(000[\d]{3}|002[\d]{3}|300[\d]{3}|600[\d]{3}|60[\d]{4})$</code></td><td style='text-align:left;' ><span>A股，例如：</span><code>600519</code></td></tr><tr><td style='text-align:left;' ><span>银行卡卡号</span></td><td style='text-align:left;' ><code>^[1-9]{1}(?:\d{15}|\d{18})$</code></td><td style='text-align:left;' ><span>一般为19位</span></td></tr></tbody></table></figure><h2 id='互联网相关'><strong><span>互联网相关</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>描述</span></th><th style='text-align:left;' ><span>正则表达式</span></th><th style='text-align:left;' ><span>备注</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>域名</span></td><td style='text-align:left;' ><code>^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$</code></td><td style='text-align:left;' ><span>例如：r2coding.com</span></td></tr><tr><td style='text-align:left;' ><span>网址</span></td><td style='text-align:left;' ><code>^(?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$</code></td><td style='text-align:left;' ><span>例如：</span><a href='https://www.r2coding.com/' target='_blank' class='url'>https://www.r2coding.com/</a></td></tr><tr><td style='text-align:left;' ><span>带端口号的网址(或IP)</span></td><td style='text-align:left;' ><code>^(?:https?:\/\/)?[\w-]+(?:\.[\w-]+)+:\d{1,5}\/?$</code></td><td style='text-align:left;' ><span>例如：</span><code>http://127.0.0.1:8888/</code></td></tr><tr><td style='text-align:left;' ><span>URL</span></td><td style='text-align:left;' ><code>^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()!@:%_\+.~#?&amp;\/\/=]*)$</code></td><td style='text-align:left;' ><span>例如：</span><a href='https://www.r2coding.com/#/README?id=1' target='_blank' class='url'>https://www.r2coding.com/#/README?id=1</a></td></tr><tr><td style='text-align:left;' ><span>邮箱email</span></td><td style='text-align:left;' ><code>^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$</code></td><td style='text-align:left;' ><span>支持中文，例如：</span><code>codesheep@cs.com</code></td></tr><tr><td style='text-align:left;' ><span>用户名</span></td><td style='text-align:left;' ><code>^[a-zA-Z0-9_-]{4,20}$</code></td><td style='text-align:left;' ><span>4到20位</span></td></tr><tr><td style='text-align:left;' ><span>弱密码</span></td><td style='text-align:left;' ><code>^[\w]{6,16}$</code></td><td style='text-align:left;' ><span>6~16位，包含大小写字母和数字的组合</span></td></tr><tr><td style='text-align:left;' ><span>强密码</span></td><td style='text-align:left;' ><code>^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@\.#$%^&amp;*? ]).*$</code></td><td style='text-align:left;' ><span>至少6位，包括至少1个大写字母，1个小写字母，1个数字，1个特殊字符</span></td></tr><tr><td style='text-align:left;' ><span>端口号</span></td><td style='text-align:left;' ><code>^(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$</code></td><td style='text-align:left;' ><span>例如：</span><code>65535</code></td></tr><tr><td style='text-align:left;' ><span>IPv4地址</span></td><td style='text-align:left;' ><code>^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$</code></td><td style='text-align:left;' ><span>例如：</span><code>192.168.31.1</code></td></tr><tr><td style='text-align:left;' ><span>IPv4地址+端口</span></td><td style='text-align:left;' ><code>^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$</code></td><td style='text-align:left;' ><span>例如：</span><code>192.168.31.1:8080</code></td></tr><tr><td style='text-align:left;' ><span>IPv6地址</span></td><td style='text-align:left;' ><code>^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$</code></td><td style='text-align:left;' ><span>例如：</span><code>CDCD:910A:2222:5498:8475:1111:3900:2020</code></td></tr><tr><td style='text-align:left;' ><span>IPv6地址+端口</span></td><td style='text-align:left;' ><code>^\[(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\](?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$</code></td><td style='text-align:left;' ><span>例如：</span><code>[CDCD:910A:2222:5498:8475:1111:3900:2020]:9800</code></td></tr><tr><td style='text-align:left;' ><span>子网掩码</span></td><td style='text-align:left;' ><code>^(?:254|252|248|240|224|192|128)\.0\.0\.0|255\.(?:254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(?:254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(?:255|254|252|248|240|224|192|128|0)$</code></td><td style='text-align:left;' ><span>例如：</span><code>255.255.255.0</code></td></tr><tr><td style='text-align:left;' ><span>MAC地址</span></td><td style='text-align:left;' ><code>^(?:(?:[a-f0-9A-F]{2}:){5}|(?:[a-f0-9A-F]{2}-){5})[a-f0-9A-F]{2}$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>Version版本号</span></td><td style='text-align:left;' ><code>^\d+(?:\.\d+){2}$</code></td><td style='text-align:left;' ><span>例如：</span><code>12.1.1</code></td></tr><tr><td style='text-align:left;' ><span>图片后缀</span></td><td style='text-align:left;' ><code>\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif)+</code></td><td style='text-align:left;' ><span>可按需增删扩展名集合</span></td></tr><tr><td style='text-align:left;' ><span>视频后缀</span></td><td style='text-align:left;' ><code>\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4)+</code></td><td style='text-align:left;' ><span>可按需增删扩展名集合</span></td></tr><tr><td style='text-align:left;' ><span>图片链接</span></td><td style='text-align:left;' ><code>(?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.+\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif)</code></td><td style='text-align:left;' ><span>可按需增删扩展名集合</span></td></tr><tr><td style='text-align:left;' ><span>视频链接</span></td><td style='text-align:left;' ><code>(?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.+\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4)</code></td><td style='text-align:left;' ><span>可按需增删扩展名集合</span></td></tr><tr><td style='text-align:left;' ><span>迅雷链接</span></td><td style='text-align:left;' ><code>thunderx?:\/\/[a-zA-Z\d]+=</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>ed2k链接</span></td><td style='text-align:left;' ><code>ed2k:\/\/\|file\|.+\|\/</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>磁力链接</span></td><td style='text-align:left;' ><code>magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.*</code></td><td style='text-align:left;' >&nbsp;</td></tr></tbody></table></figure><h2 id='其他'><strong><span>其他</span></strong></h2><figure><table><thead><tr><th style='text-align:left;' ><span>描述</span></th><th style='text-align:left;' ><span>正则表达式</span></th><th style='text-align:left;' ><span>备注</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>Windows文件路径</span></td><td style='text-align:left;' ><code>^[a-zA-Z]:(?:\\[\w\u4E00-\u9FA5\s]+)+[.\w\u4E00-\u9FA5\s]+$</code></td><td style='text-align:left;' ><span>例如：</span><code>C:\Users\Administrator\Desktop\a.txt</code></td></tr><tr><td style='text-align:left;' ><span>Windows文件夹路径</span></td><td style='text-align:left;' ><code>^[a-zA-Z]:(?:\\[\w\u4E00-\u9FA5\s]+)+$</code></td><td style='text-align:left;' ><span>例如：</span><code>C:\Users\Administrator\Desktop</code></td></tr><tr><td style='text-align:left;' ><span>Linux文件路径</span></td><td style='text-align:left;' ><code>^\/(?:[^/]+\/)*[^/]+$</code></td><td style='text-align:left;' ><span>例如：</span><code>/root/library/a.txt</code></td></tr><tr><td style='text-align:left;' ><span>Linux文件夹路径</span></td><td style='text-align:left;' ><code>^\/(?:[^/]+\/)*$</code></td><td style='text-align:left;' ><span>例如：</span><code>/root/library/</code></td></tr><tr><td style='text-align:left;' ><span>MD5格式</span></td><td style='text-align:left;' ><code>^(?:[a-f\d]{32}|[A-F\d]{32})$</code></td><td style='text-align:left;' ><span>32位MD5，例如：</span><code>7552E7071B118CBFFEC8C930455B4297</code></td></tr><tr><td style='text-align:left;' ><span>BASE64格式</span></td><td style='text-align:left;' ><code>^\s*data:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&amp;&#39;,()*+;=\-._~:@/?%\s]*?)\s*$</code></td><td style='text-align:left;' ><span>例如：</span><code></code></td></tr><tr><td style='text-align:left;' ><span>UUID</span></td><td style='text-align:left;' ><code>^[a-f\d]{4}(?:[a-f\d]{4}-){4}[a-f\d]{12}$</code></td><td style='text-align:left;' ><span>例如：</span><code>94f9d45a-71b0-4b3c-b69d-20c4bc9c8fdd</code></td></tr><tr><td style='text-align:left;' ><span>16进制</span></td><td style='text-align:left;' ><code>^[A-Fa-f0-9]+$</code></td><td style='text-align:left;' ><span>例如：</span><code>FFFFFF</code></td></tr><tr><td style='text-align:left;' ><span>16进制颜色</span></td><td style='text-align:left;' ><code>^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$</code></td><td style='text-align:left;' ><span>例如：</span><code>#FFFFFF</code></td></tr><tr><td style='text-align:left;' ><span>SQL语句</span></td><td style='text-align:left;' ><code>^(?:select|drop|delete|create|update|insert).*$</code></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:left;' ><span>Java包名</span></td><td style='text-align:left;' ><code>^(?:[a-zA-Z_]\w*)+(?:[.][a-zA-Z_]\w*)+$</code></td><td style='text-align:left;' ><span>例如：</span><code>com.r2coding.controller</code></td></tr><tr><td style='text-align:left;' ><span>文件扩展名</span></td><td style='text-align:left;' ><code>\.(?:doc|pdf|txt)</code></td><td style='text-align:left;' ><span>可按需增删扩展名集合</span></td></tr><tr><td style='text-align:left;' ><span>HTML标签</span></td><td style='text-align:left;' ><code>&lt;(\w+)[^&gt;]*&gt;(.*?&lt;\/\1&gt;)?</code></td><td style='text-align:left;' ><span>例如：</span><code>&lt;div class=&quot;navigator&quot;&gt;&lt;/div&gt;</code></td></tr><tr><td style='text-align:left;' ><span>HTML注释</span></td><td style='text-align:left;' ><code>&lt;!--(.*?)--&gt;</code></td><td style='text-align:left;' ><span>例如：</span><code>&lt;!--注释--&gt;</code></td></tr></tbody></table></figure><h1 id='花絮'><span>花絮</span></h1><blockquote><p><span>该⽂档会持续更新，有新东⻄再往⾥加。另外由于时间仓促和个⼈精⼒有限，难免会有疏漏和不当的地⽅，还望多多谅解。</span></p></blockquote><blockquote><p><span>后续整理出来的资源和文档会第一时间在此分享 ↓</span></p></blockquote><p><img src="https://codesheep.oss-cn-hangzhou.aliyuncs.com/blog/contact.jpg" referrerpolicy="no-referrer"></p><blockquote><p><span>本文档 GitHub </span><a href='https://github.com/rd2coding/Road2Coding'><span>https://github.com/rd2coding/Road2Coding</span></a><span> 已经收录，里面有我整理的</span><strong><span>6大编程方向的自学路线+知识点大梳理</span></strong><span>、</span><strong><span>我的简历</span></strong><span>、</span><strong><span>面试考点</span></strong><span>、</span><strong><span>几本硬核pdf笔记</span></strong><span>，以及</span><strong><span>程序员生活和感悟</span></strong><span>，欢迎star。</span></p></blockquote><p><strong><span>另附：其他干货文档笔记下载（点击标题链接可跳转）：</span></strong></p><ul><li><a href='https://mp.weixin.qq.com/s/GJYVt376C_g4406ux5uw0Q'><span>Linux速查备忘手册.pdf下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/EaDLaLy3YjrNiSoNofwMMA'><span>数据结构和算法刷题笔记.pdf下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/qR6KTfldk41lsOj1Ghp6Og'><span>LeetCode算法刷题C/C++版答案pdf下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/kWTJ9640mPegr5wqVE0GMg'><span>LeetCode算法刷题Java版答案pdf下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/EKBRCNr_3n0y8CCSUNPdPg'><span>找工作简历模板集(word格式)下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/jn7oraFlhRkOmiv3rh74WA'><span>Java基础核心知识大总结.pdf 下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/BRQ-3uvstdZPO-cnLGCVzA'><span>C/C++常见面试题（含答案）下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/miV4SH1Eb_FMogQ2XYvPuA'><span>设计模式学习笔记.pdf下载</span></a></li><li><a href='https://mp.weixin.qq.com/s/x9E7ogAxFNpODXkAXCZZ3w'><span>Java后端开发学习路线+知识点总结</span></a></li><li><a href='https://mp.weixin.qq.com/s/xUKlD-Ro4x55NfANAwxJUw'><span>前端开发学习路线+知识点总结</span></a></li><li><a href='https://mp.weixin.qq.com/s/vBCwU-BCsGVNpjJM__LheQ'><span>大数据开发学习路线+知识点总结</span></a></li><li><a href='https://mp.weixin.qq.com/s/ac8vgjob8nDqM1Q7FGLRiA'><span>C/C++(后台)学习路线+知识点总结</span></a></li><li><a href='https://mp.weixin.qq.com/s/nkBsUgbuMK3ArHfFc2417w'><span>嵌入式开发学习路线+知识点总结</span></a></li></ul></div></div>
</body>
</html>